This report summarizes the results of an ongoing study focused on understanding the impact of the COVID-19 pandemic on Critical Care research. It includes data submitted by 126 centres between 2020-03-23 and 2020-06-18.

Participating centres


ICU location

Country ICUs
CAN 37
USA 30
AUS 21
FRA 5
NLD 5
NZL 4
ARG 2
GBR 2
IDN 2
ITA 2
MEX 2
SGP 2
THA 2
BRA 1
COL 1
DNK 1
ECU 1
IND 1
LBN 1
MYS 1
PAK 1
URY 1
VNM 1

ICU population


Centre type


Surveys per month

Month Count
March 107
April 104
May 101
June 43

COVID-19


Are there any patients in your hospital with CONFIRMED COVID-19? (n = 353 surveys)


Are there any patients in your ICU with CONFIRMED COVID-19? (n = 353 surveys)


Is your ICU currently enrolling patients in any COVID-19 specific studies? (n = 346 surveys)


What types of COVID-19 specific research studies are currently enrolling patients in your ICU? (n = 354 surveys) (Question added after start of the study)

Month Randomized Non-randomized Observational Other
March 2020 14 1 25 1
April 2020 26 12 58 3
May 2020 39 14 68 2
June 2020 16 5 33 2

Is your ICU currently preparing for any COVID-19 specific studies? (Question added after start of the study)

Institutional policies


Is your REB/IRB prioritizing approval or willing to expedite approval of COVID-19 protocols? (n = 354 surveys)



Impact on research


Because of COVID-19 or preparation for it, has your ICU:

Suspended recruitment for any studies? (n = 354 surveys)


Modified recruitment for current studies? (n = 353 surveys)


Delayed the initiation of new (non-COVID-19) studies? (n = 352 surveys)


Enrolled MORE patients in studies because of increased patient volume? (n = 353 surveys)


Enrolled FEWER patients in studies because of increased patient volume? (n = 352 surveys)


Changed the approach to co-enrollment in studies? (n = 352 surveys)


Changed or stopped collection of biologic samples? (n = 352 surveys)


Other effects on studies in your ICU? (n = 341 surveys)


Reasons for impact


Because of COVID-19 or preparation for it, how much of an effect have the following had on research in your ICU?

Research staff WITH a clinical background are needed to work clinically (n = 353 surveys)


Research staff WITHOUT a clinical background are needed to help with hospital activities (n = 352 surveys)


Investigators are needed to work clinically (n = 259 surveys) (Question added after start of the study)


Research staff are concerned about their safety working during outbreak (n = 352 surveys)


Your pediatric ICU is admitting (or planning to admit) adults (n = 156 surveys) (Question added after start of the study)


Not enough research staff for increased number of COVID-19 studies (n = 348 surveys)


Not enough research staff for increased number of eligible patients (n = 352 surveys)


Infection control policies limiting research staff access to the ICU (n = 351 surveys)


Infection control policies limiting research staff access to patients with confirmed or suspected COVID-19 (n = 352 surveys)


Clinical staff are too busy to complete research-related tasks (n = 352 surveys)


Research facilities for processing or storage of biological samples are closed or have reduced capacity (n = 293 surveys) (Question added after start of the study)


COVID-19 specific research is prioritized over other research (n = 351 surveys)

To join this study


On behalf of the Canadian Critical Care Trials Group and Canadian Critical Care Research Coordinators group, we invite your site to participate in a short longitudinal survey of the effects of COVID-19 on critical care research.

Use this link to send us the name and email of the person who will complete the survey on behalf of your centre: http://bit.ly/3aNqo8Z
They’ll receive a separate email with the survey within 24 hours and will get:
1) A 3-question survey about your ICU
2) A short (<10 min) monthly survey about the impact of COVID-19 on research in your ICU


About this study

Background: As we prepare for and manage COVID-19 patients in our ICUs, we realize both the importance of studying this disease and our role as global leaders in critical care research. From our experiences with SARS and H1N1, we also know that COVID-19 may both enhance and constrain current critical care research projects.

Objectives: The aims of this study are to:
1. Characterize current research activities in ICUs
2. Describe the effects of COVID-19 (and preparations) on research in ICUs, specifically to: identify new research started due to COVID-19; describe any impact on existing research activities; and identify COVID-19 hospital or ICU policies affecting research.

Methods: If you agree for your site to participate, you or your delegate will receive:
• A link to a single, brief survey (3 questions) about your ICU
• A link to a short (<10 minutes) survey about the impact of COVID-19 on research in your ICU. It will be sent on the first of the month for the duration of the COVID-19 outbreak.
• A report summarizing the results after each monthly survey

Ethics and privacy: This study has been reviewed by the Hamilton Integrated Research Ethics Board. Participation is of course voluntary and submitting data implies your consent to participate . You can stop participating at any time and prior to analysis you can withdraw any data from your centre. We will not publish any site or personal identifying information without your express consent.

Thank you, and we welcome any suggestions for adapting and updating this survey as events in this pandemic unfold.

Mark Duffett, RPh PhD
Departments of Pediatrics and Health Research Methods, Evidence, and Impact, McMaster University, Hamilton, Canada. duffetmc@mcmaster.ca, @M_Duffett

Michelle Kho, PT PhD
School of Rehabilitation Science, McMaster University, Hamilton, Canada. khome@mcmaster.ca, @khome

LS0tCnRpdGxlOiAiSW1wYWN0IG9mIENPVklELTE5IG9uIGNyaXRpY2FsIGNhcmUgcmVzZWFyY2giCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCi0tLQoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQoKIyBsb2FkIHBhY2thZ2VzIChvdGhlciBwYWNrYWdlcyBsb2FkZWQgd2l0aCBzb3VyY2VkIGZpbGVzKQpsaWJyYXJ5KGtuaXRyKQoKIyAjIHNvdXJjZSBmaWxlcwojICMgc291cmNpbmcgbm90IHdvcmtpbmcuLi5wcm9ibGVtIHdpdGggd29ya2luZyBkaXJlY3RvcnkuIFNvIHJ1biBmaWxlcyBtYW51YWxseSBmb3Igbm93OiBSdW4gc291cmNpbmcgaW4gQ09WSUQtMTkgU3VydmV5IHJlcG9ydCAtIHNvdXJjaW5nIGZpbGVzLlIpCgojIHNldCBvcHRpb25zCm9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSBycHJvanJvb3Q6OmZpbmRfcnN0dWRpb19yb290X2ZpbGUoKSkKb3B0c19jaHVuayRzZXQoZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgaW5jbHVkZT1UUlVFKQoKIyBsaWJyYXJ5KHRpZHl2ZXJzZSkKIyBsaWJyYXJ5KFJDb2xvckJyZXdlcikKIyBsaWJyYXJ5KHNmKQojIGxpYnJhcnkocm5hdHVyYWxlYXJ0aCkKIyBsaWJyYXJ5KHJuYXR1cmFsZWFydGhkYXRhKQojIGxpYnJhcnkocmdlb3MpCiMgbGlicmFyeSh0aW55dGV4KQojIGxpYnJhcnkobHVicmlkYXRlKQpgYGAKICAKVGhpcyByZXBvcnQgc3VtbWFyaXplcyB0aGUgcmVzdWx0cyBvZiBhbiBvbmdvaW5nIHN0dWR5IGZvY3VzZWQgb24gdW5kZXJzdGFuZGluZyB0aGUgaW1wYWN0IG9mIHRoZSBDT1ZJRC0xOSBwYW5kZW1pYyBvbiBDcml0aWNhbCBDYXJlIHJlc2VhcmNoLiBJdCBpbmNsdWRlcyBkYXRhIHN1Ym1pdHRlZCBieSBgciBucm93KGRhdF9jZW50cmUpYCBjZW50cmVzIGJldHdlZW4gYHIgbWluKGRhdF9kYXRlJHJlc2VhcmNoX2ltcGFjdF90aW1lc3RhbXAsIG5hLnJtID0gVFJVRSkgYCBhbmQgYHIgbWF4KGRhdF9kYXRlJHJlc2VhcmNoX2ltcGFjdF90aW1lc3RhbXAsIG5hLnJtID0gVFJVRSlgLiAKCjwhLS0gVGFicyBub3Qgd29ya2luZyAtLT4KPCEtLW1ha2VzIHRhYnMgb3V0IG9mIHN1YmhlYWRpbmdzLS0+ICAKPCEtLSAjIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfSAgIC0tPgoKPCEtLXRhYiAxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gIAojIyBQYXJ0aWNpcGF0aW5nIGNlbnRyZXMgIAoqKiogIAojIyMgSUNVIGxvY2F0aW9uCmBgYHtyIGZpZy5mdWxsd2lkdGggPSBUUlVFfQptYXBfd29ybGQKYGBgCgpgYGB7ciBjb3VudHJpZXMsIGVjaG8gPSBGQUxTRX0KZGF0X2NlbnRyZSAlPiUgCiAgY291bnQoQ291bnRyeV9Db2RlXzMpICU+JSAKICBhcnJhbmdlKGRlc2MobikpICU+JSAKICBzZWxlY3QoQ291bnRyeSA9IENvdW50cnlfQ29kZV8zLCBJQ1VzID0gbikgJT4lIAogIGthYmxlKCkKYGBgCgoqKiogIAojIyMgSUNVIHBvcHVsYXRpb24gIApgYGB7cn0KZGF0X3JlZGNhcCAlPiUgCiAgc2VsZWN0KHJlY29yZF9pZCwgc2l0ZV9wb3ApICU+JSAKICBkcm9wX25hKHNpdGVfcG9wKSAlPiUgCiAgbXV0YXRlKHNpdGVfcG9wID0gcmVjb2RlKHNpdGVfcG9wLCAiMSIgPSAiQWR1bHQiLCAiMiIgPSAiUGVkaWF0cmljIiwgIjMiID0gIk1peGVkIikpICU+JSAKICAgIGNvdW50KHNpdGVfcG9wKSAlPiUgCiAgbXV0YXRlKHBlcmMgPSBuLnBlcihuLCBzdW0obiksIDApLAogICAgICAgICBsYWJlbCA9IHBhc3RlKHNpdGVfcG9wLCAiXG4iLCBwZXJjLCBzZXAgPSAiIikKICAgICAgICAgKSAlPiUgCiAgbXV0YXRlKG9yZGVyID0gcm93X251bWJlcigpLAogICAgICAgICBmcmFjdGlvbiA9IG4gLyBzdW0obiksCiAgICAgICAgIGxhYmVsX3BvcyA9IChjdW1zdW0oZnJhY3Rpb24pICsgYygwLCBoZWFkKGN1bXN1bShmcmFjdGlvbiksIG4gPSAtMSkpKSAvIDIpICU+JSAKZ2dwbG90KGFlcyh4ID0gMiwgeSA9IGZyYWN0aW9uLCBmaWxsID0gZmN0X3Jlb3JkZXIobGFiZWwsIHJldihvcmRlcikpICkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJmaWxsIiwgd2lkdGggPSAxKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGxhYmVsLCB5ID0gbGFiZWxfcG9zLCBoanVzdCA9ICJvdXR3YXJkIiksIAogICAgICAgICAgICBsaW5laGVpZ2h0ID0gMC45LCB4ID0gMi43NSwgc2l6ZSA9IDQpICsKICBjb29yZF9wb2xhcigieSIsIHN0YXJ0ID0gMCwgY2xpcCA9ICJvZmYiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLjA1LCAyLjUpKSsKICB0aGVtZV92b2lkKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKYGBgCgoqKiogIAojIyMgQ2VudHJlIHR5cGUgIApgYGB7cn0KZGF0X3JlZGNhcCAlPiUgCiAgc2VsZWN0KHJlY29yZF9pZCwgc2l0ZV9zZXR0aW5nKSAlPiUgCiAgZHJvcF9uYShzaXRlX3NldHRpbmcpICU+JSAKICBtdXRhdGUoc2l0ZV9zZXR0aW5nID0gcmVjb2RlKHNpdGVfc2V0dGluZywgIjEiID0gIkFjYWRlbWljIiwgIjIiID0gIkNvbW11bml0eSIpKSAlPiUgCiAgICBjb3VudChzaXRlX3NldHRpbmcpICU+JSAKICBtdXRhdGUocGVyYyA9IG4ucGVyKG4sIHN1bShuKSwgMCksCiAgICAgICAgIGxhYmVsID0gcGFzdGUoc2l0ZV9zZXR0aW5nLCAiXG4iLCBwZXJjLCBzZXAgPSAiIikKICAgICAgICAgKSAlPiUgCiAgbXV0YXRlKG9yZGVyID0gcm93X251bWJlcigpLAogICAgICAgICBmcmFjdGlvbiA9IG4gLyBzdW0obiksCiAgICAgICAgIGxhYmVsX3BvcyA9IChjdW1zdW0oZnJhY3Rpb24pICsgYygwLCBoZWFkKGN1bXN1bShmcmFjdGlvbiksIG4gPSAtMSkpKSAvIDIpICU+JSAKZ2dwbG90KGFlcyh4ID0gMiwgeSA9IGZyYWN0aW9uLCBmaWxsID0gZmN0X3Jlb3JkZXIobGFiZWwsIHJldihvcmRlcikpICkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJmaWxsIiwgd2lkdGggPSAxKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGxhYmVsLCB5ID0gbGFiZWxfcG9zLCBoanVzdCA9ICJvdXR3YXJkIiksIAogICAgICAgICAgICBsaW5laGVpZ2h0ID0gMC45LCB4ID0gMi43NSwgc2l6ZSA9IDQpICsKICBjb29yZF9wb2xhcigieSIsIHN0YXJ0ID0gMCwgY2xpcCA9ICJvZmYiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJBY2NlbnQiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLjA1LCAyLjUpKSsKICB0aGVtZV92b2lkKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKYGBgCiAKIAoqKioKIyMjIFN1cnZleXMgcGVyIG1vbnRoCgpgYGB7cn0KZGF0X3JlZGNhcCAlPiUKICBzZWxlY3QocmVkY2FwX2V2ZW50X25hbWUpICU+JQogIGZpbHRlcihyZWRjYXBfZXZlbnRfbmFtZSAhPSAiY2VudHJlX2luZm9fYXJtXzEiKSAlPiUKICBtdXRhdGUoTW9udGggPSBjYXNlX3doZW4oCiAgICByZWRjYXBfZXZlbnRfbmFtZSA9PSAiMjAyMDAzX2FybV8xIiB+ICJNYXJjaCIsCiAgICByZWRjYXBfZXZlbnRfbmFtZSA9PSAiMjAyMDA0X2FybV8xIiB+ICJBcHJpbCIsCiAgICByZWRjYXBfZXZlbnRfbmFtZSA9PSAiMjAyMDA1X2FybV8xIiB+ICJNYXkiLAogICAgcmVkY2FwX2V2ZW50X25hbWUgPT0gIjIwMjAwNl9hcm1fMSIgfiAiSnVuZSIKICApKSAlPiUKICBtdXRhdGUoTW9udGggPSBmY3RfcmVsZXZlbChNb250aCwgYygiTWFyY2giLCAiQXByaWwiLCAiTWF5IiwgIkp1bmUiKSkpICU+JQogIGdyb3VwX2J5KE1vbnRoKSAlPiUKICBkcm9wX25hKCkgJT4lCiAgdGFsbHkoKSAlPiUKICBzZWxlY3QoTW9udGgsICJDb3VudCIgPSBuKSAlPiUKICBrYWJsZSgpCmBgYAogICAKICAgIApgYGB7cn0KIyB3ZWVrbHlfZGVtbyAlPiUgIAojICAga2FibGUoKQpgYGAKICAKPCEtLXRhYiAzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gIAoqKiogIAojIyBDT1ZJRC0xOSAgCgoqKioKKipBcmUgdGhlcmUgYW55IHBhdGllbnRzIGluIHlvdXIgaG9zcGl0YWwgd2l0aCBDT05GSVJNRUQgQ09WSUQtMTk/KiogKG4gPSBgciBzdW0oIWlzLm5hKGRhdF9yZWRjYXAkY292aWRfaG9zcCkpYCBzdXJ2ZXlzKQoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9NiwgcmVzdWx0cyA9ICJob2xkIn0KZ2dwbG90KG1vbnRobHlfY292aWRfaG9zcCkgKwogIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSB4bWF4LCB5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSBjb3ZpZF9ob3NwKSwgCiAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIsIHNpemUgPSAxKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QobmFtZSA9ICIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X2NvdmlkX2hvc3AkeGNlbnRlciwgbGFiZWxzID0gbW9udGhseV9jb3ZpZF9ob3NwJG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwpgYGAKCioqKgoqKkFyZSB0aGVyZSBhbnkgcGF0aWVudHMgaW4geW91ciBJQ1Ugd2l0aCBDT05GSVJNRUQgQ09WSUQtMTk/KiogKG4gPSBgciBzdW0oIWlzLm5hKGRhdF9yZWRjYXAkY292aWRfaG9zcCkpYCBzdXJ2ZXlzKQoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9NiwgcmVzdWx0cyA9ICJob2xkIn0KZ2dwbG90KG1vbnRobHlfY292aWRfaWN1KSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0geG1pbiwgeG1heCA9IHhtYXgsIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IGNvdmlkX2ljdSksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG5hbWUgPSAiIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbW9udGhseV9jb3ZpZF9pY3UkeGNlbnRlciwgbGFiZWxzID0gbW9udGhseV9jb3ZpZF9pY3UkbW9udGgsCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWVfbW9zYWljCmBgYAoqKioKKipJcyB5b3VyIElDVSBjdXJyZW50bHkgZW5yb2xsaW5nIHBhdGllbnRzIGluIGFueSBDT1ZJRC0xOSBzcGVjaWZpYyBzdHVkaWVzPyoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJHJlc19jb3ZpZF9hbnkpKWAgc3VydmV5cykKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTYsIHJlc3VsdHMgPSAiaG9sZCJ9CmdncGxvdChtb250aGx5X3Jlc19jb3ZpZF9hbnkpICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gcmVzX2NvdmlkX2FueSksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG5hbWUgPSAiIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbW9udGhseV9yZXNfY292aWRfYW55JHhjZW50ZXIsIGxhYmVscyA9IG1vbnRobHlfcmVzX2NvdmlkX2FueSRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKCmBgYAoKKioqCioqV2hhdCB0eXBlcyBvZiBDT1ZJRC0xOSBzcGVjaWZpYyByZXNlYXJjaCBzdHVkaWVzIGFyZSBjdXJyZW50bHkgZW5yb2xsaW5nIHBhdGllbnRzIGluIHlvdXIgSUNVPyoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJGNvdmlkX3JlYikpYCBzdXJ2ZXlzKSAoUXVlc3Rpb24gYWRkZWQgYWZ0ZXIgc3RhcnQgb2YgdGhlIHN0dWR5KSAKCmBgYHtyfQpkYXRfcmVkY2FwICU+JSAKICBmaWx0ZXIocmVkY2FwX2V2ZW50X25hbWUgJWluJSBjKCIyMDIwMDNfYXJtXzEiLCAiMjAyMDA0X2FybV8xIiwgIjIwMjAwNV9hcm1fMSIsICIyMDIwMDZfYXJtXzEiKSkgJT4lCiAgbXV0YXRlKE1vbnRoID0gcmVjb2RlKHJlZGNhcF9ldmVudF9uYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgIjIwMjAwM19hcm1fMSIgPSAiTWFyY2ggMjAyMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAiMjAyMDA0X2FybV8xIiA9ICJBcHJpbCAyMDIwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICIyMDIwMDVfYXJtXzEiID0gIk1heSAyMDIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgIjIwMjAwNl9hcm1fMSIgPSAiSnVuZSAyMDIwIiksCiAgICAgICAgIE1vbnRoID0gZmN0X2lub3JkZXIoTW9udGgpKSAlPiUKICBzZWxlY3QoTW9udGgsICJSYW5kb21pemVkIiA9IHJlc19jb3ZfdHlwZV9fXzEsICJOb24tcmFuZG9taXplZCIgPSByZXNfY292X3R5cGVfX18yICwgIk9ic2VydmF0aW9uYWwiID0gcmVzX2Nvdl90eXBlX19fMywgIk90aGVyIiA9IHJlc19jb3ZfdHlwZV9fXzQpICU+JQogIG11dGF0ZV9hdChjKCJSYW5kb21pemVkIiwgIk5vbi1yYW5kb21pemVkIiwgIk9ic2VydmF0aW9uYWwiLCAiT3RoZXIiKSwgYXMubnVtZXJpYykgJT4lCiAgZ3JvdXBfYnkoTW9udGgpICU+JQogIHN1bW1hcmlzZV9hdChjKCJSYW5kb21pemVkIiwgIk5vbi1yYW5kb21pemVkIiwgIk9ic2VydmF0aW9uYWwiLCAiT3RoZXIiKSxzdW0sIG5hLnJtPSBUUlVFKSU+JQogIGthYmxlKGFsaWduID0gImMiKQoKI1RoaXMgaXMgdGhlIGNvZGUgSSBoYXZlIHRyaWFsIGJ1dCBJIGFtIHN0dWNrIGhlcmUKI2RhdF9yZWRjYXAgJT4lIAogI2ZpbHRlcihyZWRjYXBfZXZlbnRfbmFtZSAhPSAiY2VudHJlX2luZm9fYXJtXzEiKSAlPiUKICAjbXV0YXRlKE1vbnRoID0gcmVjb2RlKHJlZGNhcF9ldmVudF9uYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgIyIyMDIwMDNfYXJtXzEiID0gIk1hcmNoIDIwMjAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIyIyMDIwMDRfYXJtXzEiID0gIkFwcmlsIDIwMjAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIyIyMDIwMDVfYXJtXzEiID0gIk1heSAyMDIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgIyIyMDIwMDZfYXJtXzEiID0gIkp1bmUgMjAyMCIpLAogICAgICAgICNNb250aCA9IGZjdF9pbm9yZGVyKE1vbnRoKSkgJT4lCiAgI3NlbGVjdChNb250aCwgcmVjb3JkX2lkLCAgIlJhbmRvbWl6ZWQiID0gcmVzX2Nvdl90eXBlX19fMSwgIk5vbi1yYW5kb21pemVkIiA9IHJlc19jb3ZfdHlwZV9fXzIgLCAiT2JzZXJ2YXRpb25hbCIgPSByZXNfY292X3R5cGVfX18zLCAiT3RoZXIiID0gcmVzX2Nvdl90eXBlX19fNCkgJT4lCiAgI211dGF0ZV9hdChjKCJSYW5kb21pemVkIiwgIk5vbi1yYW5kb21pemVkIiwgIk9ic2VydmF0aW9uYWwiLCAiT3RoZXIiKSwgYXMubnVtZXJpYykgJT4lCiAgI211dGF0ZSgiU2l0ZSBDb3VudCIgPSBjYXNlX3doZW4oCiAgICAjUmFuZG9taXplZCA9PSAxIHwgYE5vbi1yYW5kb21pemVkYCA9PSAxIHwgT2JzZXJ2YXRpb25hbCA9PSAxIHwgT3RoZXIgPT0gMSB+IDEsCiAgICAjVFJVRSB+IDAKICAjKSkgJT4lCiAgI2dyb3VwX2J5KE1vbnRoKSAlPiUKICAjc3VtbWFyaXNlX2F0KGMoIlJhbmRvbWl6ZWQiLCAiTm9uLXJhbmRvbWl6ZWQiLCAiT2JzZXJ2YXRpb25hbCIsICJPdGhlciIsICJTaXRlIENvdW50Iiksc3VtLCBuYS5ybT0gVFJVRSkKCgojQ29tbWVudHMKI2RhdF9yZWRjYXAgJT4lIAogICNzZWxlY3QoT3RoZXIgPSByZXNfY292X3R5cGVfb3RoZXIpICU+JSAKICAjZHJvcF9uYShPdGhlcikgJT4lIAogICNrYWJsZSgpCmBgYAoqKioKKipJcyB5b3VyIElDVSBjdXJyZW50bHkgcHJlcGFyaW5nIGZvciBhbnkgQ09WSUQtMTkgc3BlY2lmaWMgc3R1ZGllcz8qKiAoUXVlc3Rpb24gYWRkZWQgYWZ0ZXIgc3RhcnQgb2YgdGhlIHN0dWR5KQoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9NiwgcmVzdWx0cyA9ICJob2xkIiwgd2FybmluZz1GQUxTRX0KCmdncGxvdChtb250aGx5X3Jlc19jb3ZpZF9hbnlfcHJlcCkgKwogIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSB4bWF4LCB5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSByZXNfY292aWRfYW55X3ByZXApLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChuYW1lID0gIiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCBleHBhbmQgPSBjKDAsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IG1vbnRobHlfcmVzX2NvdmlkX2FueV9wcmVwJHhjZW50ZXIsIGxhYmVscyA9IG1vbnRobHlfcmVzX2NvdmlkX2FueV9wcmVwJG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwpgYGAKCgo8IS0tdGFiIDYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiAgCiMjIEluc3RpdHV0aW9uYWwgcG9saWNpZXMgCgoqKioKKipJcyB5b3VyIFJFQi9JUkIgcHJpb3JpdGl6aW5nIGFwcHJvdmFsIG9yIHdpbGxpbmcgdG8gZXhwZWRpdGUgYXBwcm92YWwgb2YgQ09WSUQtMTkgcHJvdG9jb2xzPyoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJGNvdmlkX3JlYikpYCBzdXJ2ZXlzKQoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9NiwgcmVzdWx0cyA9ICJob2xkIiwgd2FybmluZz1GQUxTRX0KZ2dwbG90KG1vbnRobHlfY292aWRfcmViKSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0geG1pbiwgeG1heCA9IHhtYXgsIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IGNvdmlkX3JlYiksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiIiwgdmFsdWVzID0gYygiI0Y3OTc3QSIsICIjRkZGNzlBIiwgIiM4MkNBOUQiKSwgZ3VpZGUgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IEZBTFNFKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbW9udGhseV9jb3ZpZF9yZWIkeGNlbnQsIGxhYmVscyA9IG1vbnRobHlfY292aWRfcmViJG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwpgYGAKCgoKKioqCjwhLS0gKipEb2VzIHlvdXIgaW5zdGl0dXRpb24gY3VycmVudGx5IHJlcXVpcmUgc3VzcGVuZGluZyBlbnJvbG1lbnQgaW4gSUNVIHN0dWRpZXM/KiogKG4gPSBgciBzdW0oIWlzLm5hKGRhdF9yZWRjYXAkcG9saWN5KSlgKSAoUXVlc3Rpb24gYWRkZWQgYWZ0ZXIgc3RhcnQgb2YgdGhlIHN0dWR5KSAtLT4KCmBgYHtyIGZpZy5oZWlnaHQ9MiwgZmlnLndpZHRoPTYsIHJlc3VsdHMgPSAiaG9sZCIsIHdhcm5pbmc9RkFMU0V9CgojICNyZXF1aXJlIHN1c3BlbmRpbmcgZW5yb2xtZW50IGluIGljdSBzdHVkaWVzCiMgZGF0X3JlZGNhcCAlPiUgCiMgICBmaWx0ZXIocmVkY2FwX2V2ZW50X25hbWUgJWluJSBjKCIyMDIwMDNfYXJtXzEiLCAiMjAyMDA0X2FybV8xIiwgIjIwMjAwNV9hcm1fMSIsICIyMDIwMDZfYXJtXzEiKSkgJT4lCiMgICBtdXRhdGUoTW9udGggPSByZWNvZGUocmVkY2FwX2V2ZW50X25hbWUsIAojICAgICAgICAgICAgICAgICAgICAgICAgICIyMDIwMDNfYXJtXzEiID0gIk1hcmNoIDIwMjAiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAiMjAyMDA0X2FybV8xIiA9ICJBcHJpbCAyMDIwIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMjAwNV9hcm1fMSIgPSAiTWF5IDIwMjAiLAojICAgICAgICAgICAgICAgICAgICAgICAgICIyMDIwMDZfYXJtXzEiID0gIkp1bmUgMjAyMCIpLAojICAgICAgICAgIE1vbnRoID0gZmN0X2lub3JkZXIoTW9udGgpKSAlPiUKIyAgIHNlbGVjdChNb250aCwgIlllcyAtIEFsbCBzdHVkaWVzIiA9IHBvbGljeV9fXzEsICJZZXMgLSBBbGwgbm9uLUNPVklELTE5IHN0dWRpZXMiID0gcG9saWN5X19fMiAsICJZZXMgLSBTb21lIHN0dWRpZXMiID0gcG9saWN5X19fMywgIk5vIiA9IHBvbGljeV9fXzQsICJPdGhlciIgPSBwb2xpY3lfX181KSAlPiUKIyAgIG11dGF0ZV9hdChjKCJZZXMgLSBBbGwgc3R1ZGllcyIsICJZZXMgLSBBbGwgbm9uLUNPVklELTE5IHN0dWRpZXMiLCAiWWVzIC0gU29tZSBzdHVkaWVzIiwgIk90aGVyIiksIAojICAgICAgICAgICAgIGFzLm51bWVyaWMpICU+JQojICAgZ3JvdXBfYnkoTW9udGgpICU+JQojICAgc3VtbWFyaXNlX2F0KGMoIlllcyAtIEFsbCBzdHVkaWVzIiwgIlllcyAtIEFsbCBub24tQ09WSUQtMTkgc3R1ZGllcyIsICJZZXMgLSBTb21lIHN0dWRpZXMiLCAiT3RoZXIiKSxzdW0sIG5hLnJtPSBUUlVFKSAlPiUKIyAgIGthYmxlKGFsaWduID0gImMiKQoKI1RBQkxFIEZPUiBUSElTIFFVRVNUSU9OCgojVHlwZXMgb2YgU3R1ZGllcyB0aGF0IHdlcmUgYWZmZWN0ZWQ/CiNkYXRfcmVkY2FwICU+JSAKICAjc2VsZWN0KENvbW1lbnRzID0gcG9saWN5X3NvbWVfZXhwbGFpbikgJT4lIAogICNkcm9wX25hKENvbW1lbnRzKSAlPiUgCiAgI2thYmxlKCkKCiNQbGVhc2UgZXhwbGFpbiB0aGUgb3RoZXIgcmVxdWlyZW1lbnRzCiNkYXRfcmVkY2FwICU+JSAKICAjc2VsZWN0KENvbW1lbnRzID0gcG9saWN5X290aGVyKSAlPiUgCiAgI2Ryb3BfbmEoQ29tbWVudHMpICU+JSAKICAja2FibGUoKQoKYGBgCgoqKiogICAgIAo8IS0tdGFiIDQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiAgCiMjIEltcGFjdCBvbiByZXNlYXJjaCAgCioqKgoKKipCZWNhdXNlIG9mIENPVklELTE5IG9yIHByZXBhcmF0aW9uIGZvciBpdCwgaGFzIHlvdXIgSUNVOioqICAKCioqU3VzcGVuZGVkIHJlY3J1aXRtZW50IGZvciBhbnkgc3R1ZGllcz8qKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRlZmZlY3Rfc3VzcGVuZCkpYCBzdXJ2ZXlzKQpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LCByZXN1bHRzID0gImhvbGQifQpnZ3Bsb3QobW9udGhseV9lZmZlY3Rfc3VzcGVuZCkgKwogIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSB4bWF4LCB5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSBlZmZlY3Rfc3VzcGVuZCksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiIiwgdmFsdWVzID0gYygiIzgyQ0E5RCIsICIjRkZGNzlBIiwgIiNGNzk3N0EiKSwgZ3VpZGUgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IEZBTFNFKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbW9udGhseV9lZmZlY3Rfc3VzcGVuZCR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9lZmZlY3Rfc3VzcGVuZCRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKCiNkYXRfcmVkY2FwICU+JSAKICAjc2VsZWN0KENvbW1lbnRzID0gZWZmZWN0X3N1c3BlbmRfZXhwbGFpbikgJT4lIAogICNkcm9wX25hKENvbW1lbnRzKSAlPiUgCiAgI2thYmxlKCkKCmBgYAoqKioKKipNb2RpZmllZCByZWNydWl0bWVudCBmb3IgY3VycmVudCBzdHVkaWVzPyoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJGVmZmVjdF9tb2RpZnkpKWAgc3VydmV5cykKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTYsIHJlc3VsdHMgPSAiaG9sZCJ9CmdncGxvdChtb250aGx5X2VmZmVjdF9tb2RpZnkpICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gZWZmZWN0X21vZGlmeSksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiIiwgdmFsdWVzID0gYygiIzgyQ0E5RCIsICIjRkZGNzlBIiwgIiNGNzk3N0EiKSwgZ3VpZGUgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IEZBTFNFKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbW9udGhseV9lZmZlY3RfbW9kaWZ5JHhjZW50LCBsYWJlbHMgPSBtb250aGx5X2VmZmVjdF9tb2RpZnkkbW9udGgsCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWVfbW9zYWljCgoKI0NvbW1lbnRzCiNkYXRfcmVkY2FwICU+JSAKICAjc2VsZWN0KENvbW1lbnRzID0gZWZmZWN0X21vZGlmeV9leHBsYWluKSAlPiUgCiAgI2Ryb3BfbmEoQ29tbWVudHMpICU+JSAKICAja2FibGUoKQoKYGBgCioqKgoqKkRlbGF5ZWQgdGhlIGluaXRpYXRpb24gb2YgbmV3IChub24tQ09WSUQtMTkpIHN0dWRpZXM/KiogKG4gPSBgciBzdW0oIWlzLm5hKGRhdF9yZWRjYXAkZWZmZWN0X2RlbGF5KSlgIHN1cnZleXMpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LCByZXN1bHRzID0gImhvbGQiLCB3YXJuaW5nPUZBTFNFfQpnZ3Bsb3QobW9udGhseV9lZmZlY3RfZGVsYXkpICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gZWZmZWN0X2RlbGF5KSwgCiAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIsIHNpemUgPSAxKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICIiLCB2YWx1ZXMgPSBjKCIjODJDQTlEIiwgIiNGRkY3OUEiLCAiI0Y3OTc3QSIpLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gRkFMU0UpKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X2VmZmVjdF9kZWxheSR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9lZmZlY3RfZGVsYXkkbW9udGgsCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWVfbW9zYWljCgojQ29tbWVudHMKI2RhdF9yZWRjYXAgJT4lIAogICNzZWxlY3QoQ29tbWVudHMgPSBlZmZlY3RfZGVsYXlfZXhwbGFpbikgJT4lIAogICNkcm9wX25hKENvbW1lbnRzKSAlPiUgCiAgI2thYmxlKCkKCmBgYAoKKioqCioqRW5yb2xsZWQgTU9SRSBwYXRpZW50cyBpbiBzdHVkaWVzIGJlY2F1c2Ugb2YgaW5jcmVhc2VkIHBhdGllbnQgdm9sdW1lPyoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJGVmZmVjdF9tb3JlKSlgIHN1cnZleXMpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LCByZXN1bHRzID0gImhvbGQiLCB3YXJuaW5nPUZBTFNFfQpnZ3Bsb3QobW9udGhseV9lZmZlY3RfbW9yZSkgKwogIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSB4bWF4LCB5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSBlZmZlY3RfbW9yZSksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiIiwgdmFsdWVzID0gYygiIzgyQ0E5RCIsICIjRkZGNzlBIiwgIiNGNzk3N0EiKSwgZ3VpZGUgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IEZBTFNFKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbW9udGhseV9lZmZlY3RfbW9yZSR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9lZmZlY3RfbW9yZSRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKCiNDb21tZW50cyBBREQgVEhJUyBCQUNLIElOIElGIFRIRVJFIEFSRSBDT01NRU5UUwojZGF0X3JlZGNhcCAlPiUKICAjc2VsZWN0KENvbW1lbnRzID0gZWZmZWN0X21vcmVfZXhwbGFpbikgJT4lCiAgI2Ryb3BfbmEoQ29tbWVudHMpICU+JQogICNrYWJsZSgpCgpgYGAKCioqKgoqKkVucm9sbGVkIEZFV0VSIHBhdGllbnRzIGluIHN0dWRpZXMgYmVjYXVzZSBvZiBpbmNyZWFzZWQgcGF0aWVudCB2b2x1bWU/KiogKG4gPSBgciBzdW0oIWlzLm5hKGRhdF9yZWRjYXAkZWZmZWN0X2xlc3MpKWAgc3VydmV5cykKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTYsIHJlc3VsdHMgPSAiaG9sZCJ9CmdncGxvdChtb250aGx5X2VmZmVjdF9sZXNzKSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0geG1pbiwgeG1heCA9IHhtYXgsIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IGVmZmVjdF9sZXNzKSwgCiAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIsIHNpemUgPSAxKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICIiLCB2YWx1ZXMgPSBjKCIjODJDQTlEIiwgIiNGRkY3OUEiLCAiI0Y3OTc3QSIpLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gRkFMU0UpKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X2VmZmVjdF9sZXNzJHhjZW50LCBsYWJlbHMgPSBtb250aGx5X2VmZmVjdF9sZXNzJG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwoKI0NvbW1lbnRzCiNkYXRfcmVkY2FwICU+JSAKICAjc2VsZWN0KENvbW1lbnRzID0gZWZmZWN0X2xlc3NfZXhwbGFpbikgJT4lIAogICNkcm9wX25hKENvbW1lbnRzKSAlPiUgCiAgI2thYmxlKCkKCmBgYAoKKioqCioqQ2hhbmdlZCB0aGUgYXBwcm9hY2ggdG8gY28tZW5yb2xsbWVudCBpbiBzdHVkaWVzPyoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJGVmZmVjdF9jbykpYCBzdXJ2ZXlzKQkKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTYsIHJlc3VsdHMgPSAiaG9sZCIsIHdhcm5pbmc9RkFMU0V9CmdncGxvdChtb250aGx5X2VmZmVjdF9jbykgKwogIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSB4bWF4LCB5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSBlZmZlY3RfY28pLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIiIsIHZhbHVlcyA9IGMoIiM4MkNBOUQiLCAiI0ZGRjc5QSIsICIjRjc5NzdBIiksIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBGQUxTRSkpKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IG1vbnRobHlfZWZmZWN0X2NvJHhjZW50LCBsYWJlbHMgPSBtb250aGx5X2VmZmVjdF9jbyRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKCiNDb21tZW50cwojZGF0X3JlZGNhcCAlPiUgCiAgI3NlbGVjdChDb21tZW50cyA9IGVmZmVjdF9jb19leHBsYWluKSAlPiUgCiAgI2Ryb3BfbmEoQ29tbWVudHMpICU+JSAKICAja2FibGUoKQoKYGBgCgoqKioKKipDaGFuZ2VkIG9yIHN0b3BwZWQgY29sbGVjdGlvbiBvZiBiaW9sb2dpYyBzYW1wbGVzPyoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJGVmZmVjdF9iaW8pKWAgc3VydmV5cykKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTYsIHJlc3VsdHMgPSAiaG9sZCJ9CmdncGxvdChtb250aGx5X2VmZmVjdF9iaW8pICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gZWZmZWN0X2JpbyksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiIiwgdmFsdWVzID0gYygiIzgyQ0E5RCIsICIjRkZGNzlBIiwgIiNGNzk3N0EiKSwgZ3VpZGUgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IEZBTFNFKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbW9udGhseV9lZmZlY3RfYmlvJHhjZW50LCBsYWJlbHMgPSBtb250aGx5X2VmZmVjdF9iaW8kbW9udGgsCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWVfbW9zYWljCgojQ29tbWVudHMKI2RhdF9yZWRjYXAgJT4lIAogICNzZWxlY3QoQ29tbWVudHMgPSBlZmZlY3RfYmlvX2V4cGxhaW4pICU+JSAKICAjZHJvcF9uYShDb21tZW50cykgJT4lIAogICNrYWJsZSgpCgpgYGAKCioqKgoqKk90aGVyIGVmZmVjdHMgb24gc3R1ZGllcyBpbiB5b3VyIElDVT8qKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRlZmZlY3Rfb3RoZXJfeW4pKWAgc3VydmV5cykKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTYsIHJlc3VsdHMgPSAiaG9sZCIsIHdhcm5pbmc9RkFMU0V9CmdncGxvdChtb250aGx5X2VmZmVjdF9vdGhlcl95bikgKwogIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSB4bWF4LCB5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSBlZmZlY3Rfb3RoZXJfeW4pLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIiIsIHZhbHVlcyA9IGMoIiM4MkNBOUQiLCAiI0ZGRjc5QSIsICIjRjc5NzdBIiksIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBGQUxTRSkpKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IG1vbnRobHlfZWZmZWN0X290aGVyX3luJHhjZW50LCBsYWJlbHMgPSBtb250aGx5X2VmZmVjdF9vdGhlcl95biRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKI0NvbW1lbnRzCiNkYXRfcmVkY2FwICU+JSAKICAjc2VsZWN0KENvbW1lbnRzID0gZWZmZWN0X290aGVyKSAlPiUgCiAgI2Ryb3BfbmEoQ29tbWVudHMpICU+JSAKICAja2FibGUoKQoKYGBgCiAgCiAKPCEtLXRhYiA1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gIAoqKiogIAojIyBSZWFzb25zIGZvciBpbXBhY3QgICAgCgoqKioKKipCZWNhdXNlIG9mIENPVklELTE5IG9yIHByZXBhcmF0aW9uIGZvciBpdCwgaG93IG11Y2ggb2YgYW4gZWZmZWN0IGhhdmUgdGhlIGZvbGxvd2luZyBoYWQgb24gcmVzZWFyY2ggaW4geW91ciBJQ1U/KioKCioqUmVzZWFyY2ggc3RhZmYgV0lUSCBhIGNsaW5pY2FsIGJhY2tncm91bmQgYXJlIG5lZWRlZCB0byB3b3JrIGNsaW5pY2FsbHkqKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRyZWFzb25fY2xpbndvcmspKWAgc3VydmV5cykKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTYuNSwgcmVzdWx0cyA9ICJob2xkIiwgd2FybmluZz1GQUxTRX0KCmdncGxvdChtb250aGx5X3JlYXNvbl9jbGlud29yaykgKwogIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSB4bWF4LCB5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSByZWFzb25fY2xpbndvcmspLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIiIsIHBhbGV0dGUgPSAiQmx1ZXMiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X3JlYXNvbl9jbGlud29yayR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9yZWFzb25fY2xpbndvcmskbW9udGgsCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWVfbW9zYWljCmBgYAoKKioqCioqUmVzZWFyY2ggc3RhZmYgV0lUSE9VVCBhIGNsaW5pY2FsIGJhY2tncm91bmQgYXJlIG5lZWRlZCB0byBoZWxwIHdpdGggaG9zcGl0YWwgYWN0aXZpdGllcyoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJHJlYXNvbl93b3JrKSlgIHN1cnZleXMpICAKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9Ni41LCByZXN1bHRzID0gImhvbGQiLCB3YXJuaW5nPUZBTFNFfQoKZ2dwbG90KG1vbnRobHlfcmVhc29uX3dvcmspICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gcmVhc29uX3dvcmspLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIiIsIHBhbGV0dGUgPSAiQmx1ZXMiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X3JlYXNvbl93b3JrJHhjZW50LCBsYWJlbHMgPSBtb250aGx5X3JlYXNvbl93b3JrJG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwoKYGBgCioqKgoqKkludmVzdGlnYXRvcnMgYXJlIG5lZWRlZCB0byB3b3JrIGNsaW5pY2FsbHkqKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRyZWFzb25fY2xpbndvcmtfaW52ZXN0KSlgIHN1cnZleXMpIChRdWVzdGlvbiBhZGRlZCBhZnRlciBzdGFydCBvZiB0aGUgc3R1ZHkpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LjUsIHJlc3VsdHMgPSAiaG9sZCIsIHdhcm5pbmc9RkFMU0V9CgpnZ3Bsb3QobW9udGhseV9yZWFzb25fY2xpbndvcmtfaW52ZXN0KSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0geG1pbiwgeG1heCA9IHhtYXgsIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IHJlYXNvbl9jbGlud29ya19pbnZlc3QpLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIiIsIHBhbGV0dGUgPSAiQmx1ZXMiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X3JlYXNvbl9jbGlud29ya19pbnZlc3QkeGNlbnQsIGxhYmVscyA9IG1vbnRobHlfcmVhc29uX2NsaW53b3JrX2ludmVzdCRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKCmBgYAoKKioqCioqUmVzZWFyY2ggc3RhZmYgYXJlIGNvbmNlcm5lZCBhYm91dCB0aGVpciBzYWZldHkgd29ya2luZyBkdXJpbmcgb3V0YnJlYWsqKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRyZWFzb25fc2FmZXR5KSlgIHN1cnZleXMpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LjUsIHJlc3VsdHMgPSAiaG9sZCJ9CmdncGxvdChtb250aGx5X3JlYXNvbl9zYWZldHkpICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gcmVhc29uX3NhZmV0eSksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKG5hbWUgPSAiIiwgcGFsZXR0ZSA9ICJCbHVlcyIsIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEpKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IG1vbnRobHlfcmVhc29uX3NhZmV0eSR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9yZWFzb25fc2FmZXR5JG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwoKYGBgCioqKgoqKllvdXIgcGVkaWF0cmljIElDVSBpcyBhZG1pdHRpbmcgKG9yIHBsYW5uaW5nIHRvIGFkbWl0KSBhZHVsdHMqKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRyZWFzb25fYWR1bHRzKSlgIHN1cnZleXMpIChRdWVzdGlvbiBhZGRlZCBhZnRlciBzdGFydCBvZiB0aGUgc3R1ZHkpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LjUsIHJlc3VsdHMgPSAiaG9sZCJ9CgpnZ3Bsb3QobW9udGhseV9yZWFzb25fYWR1bHRzKSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0geG1pbiwgeG1heCA9IHhtYXgsIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IHJlYXNvbl9hZHVsdHMpLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIiIsIHBhbGV0dGUgPSAiQmx1ZXMiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X3JlYXNvbl9hZHVsdHMkeGNlbnQsIGxhYmVscyA9IG1vbnRobHlfcmVhc29uX2FkdWx0cyRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKCmBgYAoKKioqCioqTm90IGVub3VnaCByZXNlYXJjaCBzdGFmZiBmb3IgaW5jcmVhc2VkIG51bWJlciBvZiBDT1ZJRC0xOSBzdHVkaWVzKiogKG4gPSBgciBzdW0oIWlzLm5hKGRhdF9yZWRjYXAkcmVhc29uX251bXN0dWRpZXMpKWAgc3VydmV5cykKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTYuNSwgcmVzdWx0cyA9ICJob2xkIiwgd2FybmluZz1GQUxTRX0KZ2dwbG90KG1vbnRobHlfcmVhc29uX251bXN0dWRpZXMpICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gcmVhc29uX251bXN0dWRpZXMpLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIiIsIHBhbGV0dGUgPSAiQmx1ZXMiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X3JlYXNvbl9udW1zdHVkaWVzJHhjZW50LCBsYWJlbHMgPSBtb250aGx5X3JlYXNvbl9udW1zdHVkaWVzJG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwpgYGAKCioqKgoqKk5vdCBlbm91Z2ggcmVzZWFyY2ggc3RhZmYgZm9yIGluY3JlYXNlZCBudW1iZXIgb2YgZWxpZ2libGUgcGF0aWVudHMqKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRyZWFzb25fbnVtcHRzKSlgIHN1cnZleXMpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LjUsIHJlc3VsdHMgPSAiaG9sZCIsIHdhcm5pbmc9RkFMU0V9CmdncGxvdChtb250aGx5X3JlYXNvbl9udW1wdHMpICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gcmVhc29uX251bXB0cyksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKG5hbWUgPSAiIiwgcGFsZXR0ZSA9ICJCbHVlcyIsIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEpKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IG1vbnRobHlfcmVhc29uX251bXB0cyR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9yZWFzb25fbnVtcHRzJG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwpgYGAKCioqKgoqKkluZmVjdGlvbiBjb250cm9sIHBvbGljaWVzIGxpbWl0aW5nIHJlc2VhcmNoIHN0YWZmIGFjY2VzcyB0byB0aGUgSUNVKiogKG4gPSBgciBzdW0oIWlzLm5hKGRhdF9yZWRjYXAkcmVhc29uX2FjY2Vzc2ljdSkpYCBzdXJ2ZXlzKQoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9Ni41LCByZXN1bHRzID0gImhvbGQifQpnZ3Bsb3QobW9udGhseV9yZWFzb25fYWNjZXNzaWN1KSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0geG1pbiwgeG1heCA9IHhtYXgsIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IHJlYXNvbl9hY2Nlc3NpY3UpLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIiIsIHBhbGV0dGUgPSAiQmx1ZXMiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X3JlYXNvbl9hY2Nlc3NpY3UkeGNlbnQsIGxhYmVscyA9IG1vbnRobHlfcmVhc29uX2FjY2Vzc2ljdSRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKYGBgCgoqKioKKipJbmZlY3Rpb24gY29udHJvbCBwb2xpY2llcyBsaW1pdGluZyByZXNlYXJjaCBzdGFmZiBhY2Nlc3MgdG8gcGF0aWVudHMgd2l0aCBjb25maXJtZWQgb3Igc3VzcGVjdGVkIENPVklELTE5KiogKG4gPSBgciBzdW0oIWlzLm5hKGRhdF9yZWRjYXAkcmVhc29uX2FjY2Vzc3B0KSlgIHN1cnZleXMpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LjUsIHJlc3VsdHMgPSAiaG9sZCJ9CmdncGxvdChtb250aGx5X3JlYXNvbl9hY2Nlc3NwdCkgKwogIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSB4bWF4LCB5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSByZWFzb25fYWNjZXNzcHQpLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIiIsIHBhbGV0dGUgPSAiQmx1ZXMiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X3JlYXNvbl9hY2Nlc3NwdCR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9yZWFzb25fYWNjZXNzcHQkbW9udGgsCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWVfbW9zYWljCmBgYAoKKioqCioqQ2xpbmljYWwgc3RhZmYgYXJlIHRvbyBidXN5IHRvIGNvbXBsZXRlIHJlc2VhcmNoLXJlbGF0ZWQgdGFza3MqKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRyZWFzb25fY2xpbndvcmtsb2FkKSlgIHN1cnZleXMpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LjUsIHJlc3VsdHMgPSAiaG9sZCJ9CmdncGxvdChtb250aGx5X3JlYXNvbl9jbGlud29ya2xvYWQpICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gcmVhc29uX2NsaW53b3JrbG9hZCksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKG5hbWUgPSAiIiwgcGFsZXR0ZSA9ICJCbHVlcyIsIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEpKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IG1vbnRobHlfcmVhc29uX2NsaW53b3JrbG9hZCR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9yZWFzb25fY2xpbndvcmtsb2FkJG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwpgYGAKCioqKgoqKlJlc2VhcmNoIGZhY2lsaXRpZXMgZm9yIHByb2Nlc3Npbmcgb3Igc3RvcmFnZSBvZiBiaW9sb2dpY2FsIHNhbXBsZXMgYXJlIGNsb3NlZCBvciBoYXZlIHJlZHVjZWQgY2FwYWNpdHkqKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRyZWFzb25fbGFiKSlgIHN1cnZleXMpIChRdWVzdGlvbiBhZGRlZCBhZnRlciBzdGFydCBvZiB0aGUgc3R1ZHkpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LjUsIHJlc3VsdHMgPSAiaG9sZCJ9CgpnZ3Bsb3QobW9udGhseV9yZWFzb25fbGFiKSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0geG1pbiwgeG1heCA9IHhtYXgsIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IHJlYXNvbl9sYWIpLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIiIsIHBhbGV0dGUgPSAiQmx1ZXMiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X3JlYXNvbl9sYWIkeGNlbnQsIGxhYmVscyA9IG1vbnRobHlfcmVhc29uX2xhYiRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKCmBgYAoKKioqCioqQ09WSUQtMTkgc3BlY2lmaWMgcmVzZWFyY2ggaXMgcHJpb3JpdGl6ZWQgb3ZlciBvdGhlciByZXNlYXJjaCoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJHJlYXNvbl9wcmlvcml0aWVzKSlgIHN1cnZleXMpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LjUsIHJlc3VsdHMgPSAiaG9sZCIsIHdhcm5pbmc9RkFMU0V9CmdncGxvdChtb250aGx5X3JlYXNvbl9wcmlvcml0aWVzKSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0geG1pbiwgeG1heCA9IHhtYXgsIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IHJlYXNvbl9wcmlvcml0aWVzKSwgCiAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIsIHNpemUgPSAxKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIobmFtZSA9ICIiLCBwYWxldHRlID0gIkJsdWVzIiwgZ3VpZGUgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpLCAKICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbW9udGhseV9yZWFzb25fcHJpb3JpdGllcyR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9yZWFzb25fcHJpb3JpdGllcyRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKCiNkYXRfcmVkY2FwICU+JSAKICAjc2VsZWN0KENvbW1lbnRzID0gcmVhc29uX290aGVyKSAlPiUgCiAgI2Ryb3BfbmEoQ29tbWVudHMpICU+JSAKICAja2FibGUoKQoKYGBgCgoKCjwhLS10YWIgNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+ICAKIyMgVG8gam9pbiB0aGlzIHN0dWR5IAoqKiogIApPbiBiZWhhbGYgb2YgdGhlIENhbmFkaWFuIENyaXRpY2FsIENhcmUgVHJpYWxzIEdyb3VwIGFuZCBDYW5hZGlhbiBDcml0aWNhbCBDYXJlIFJlc2VhcmNoIENvb3JkaW5hdG9ycyBncm91cCwgd2UgaW52aXRlIHlvdXIgc2l0ZSB0byBwYXJ0aWNpcGF0ZSBpbiBhIHNob3J0IGxvbmdpdHVkaW5hbCBzdXJ2ZXkgb2YgdGhlIGVmZmVjdHMgb2YgQ09WSUQtMTkgb24gY3JpdGljYWwgY2FyZSByZXNlYXJjaC4gCgoKVXNlIHRoaXMgbGluayB0byBzZW5kIHVzIHRoZSBuYW1lIGFuZCBlbWFpbCBvZiB0aGUgcGVyc29uIHdobyB3aWxsIGNvbXBsZXRlIHRoZSBzdXJ2ZXkgb24gYmVoYWxmIG9mIHlvdXIgY2VudHJlOiAgaHR0cDovL2JpdC5seS8zYU5xbzhaICAKVGhleeKAmWxsIHJlY2VpdmUgYSBzZXBhcmF0ZSBlbWFpbCB3aXRoIHRoZSBzdXJ2ZXkgd2l0aGluIDI0IGhvdXJzIGFuZCB3aWxsIGdldDogIAoxKSBBIDMtcXVlc3Rpb24gc3VydmV5IGFib3V0IHlvdXIgSUNVICAKMikgQSBzaG9ydCAoPDEwIG1pbikgbW9udGhseSBzdXJ2ZXkgYWJvdXQgdGhlIGltcGFjdCBvZiBDT1ZJRC0xOSBvbiByZXNlYXJjaCBpbiB5b3VyIElDVSAgCgoqKiogIAojIyBBYm91dCB0aGlzIHN0dWR5CgoqKkJhY2tncm91bmQ6KiogQXMgd2UgcHJlcGFyZSBmb3IgYW5kIG1hbmFnZSBDT1ZJRC0xOSBwYXRpZW50cyBpbiBvdXIgSUNVcywgd2UgcmVhbGl6ZSBib3RoIHRoZSBpbXBvcnRhbmNlIG9mIHN0dWR5aW5nIHRoaXMgZGlzZWFzZSBhbmQgb3VyIHJvbGUgYXMgZ2xvYmFsIGxlYWRlcnMgaW4gY3JpdGljYWwgY2FyZSByZXNlYXJjaC4gIEZyb20gb3VyIGV4cGVyaWVuY2VzIHdpdGggU0FSUyBhbmQgSDFOMSwgd2UgYWxzbyBrbm93IHRoYXQgQ09WSUQtMTkgbWF5IGJvdGggZW5oYW5jZSBhbmQgY29uc3RyYWluIGN1cnJlbnQgY3JpdGljYWwgY2FyZSByZXNlYXJjaCBwcm9qZWN0cy4gIAogIAoqKk9iamVjdGl2ZXM6KiogVGhlIGFpbXMgb2YgdGhpcyBzdHVkeSBhcmUgdG86ICAKMS4gQ2hhcmFjdGVyaXplIGN1cnJlbnQgcmVzZWFyY2ggYWN0aXZpdGllcyBpbiBJQ1VzICAKMi4gRGVzY3JpYmUgdGhlIGVmZmVjdHMgb2YgQ09WSUQtMTkgKGFuZCBwcmVwYXJhdGlvbnMpIG9uIHJlc2VhcmNoIGluIElDVXMsIHNwZWNpZmljYWxseSB0bzogaWRlbnRpZnkgbmV3IHJlc2VhcmNoIHN0YXJ0ZWQgZHVlIHRvIENPVklELTE5OyBkZXNjcmliZSBhbnkgaW1wYWN0IG9uIGV4aXN0aW5nIHJlc2VhcmNoIGFjdGl2aXRpZXM7IGFuZCBpZGVudGlmeSBDT1ZJRC0xOSBob3NwaXRhbCBvciBJQ1UgcG9saWNpZXMgYWZmZWN0aW5nIHJlc2VhcmNoLiAKICAKKipNZXRob2RzOioqIElmIHlvdSBhZ3JlZSBmb3IgeW91ciBzaXRlIHRvIHBhcnRpY2lwYXRlLCB5b3Ugb3IgeW91ciBkZWxlZ2F0ZSB3aWxsIHJlY2VpdmU6ICAK4oCiCUEgbGluayB0byBhIHNpbmdsZSwgYnJpZWYgc3VydmV5ICgzIHF1ZXN0aW9ucykgYWJvdXQgeW91ciBJQ1UgIArigKIJQSBsaW5rIHRvIGEgc2hvcnQgKDwxMCBtaW51dGVzKSBzdXJ2ZXkgYWJvdXQgdGhlIGltcGFjdCBvZiBDT1ZJRC0xOSBvbiByZXNlYXJjaCBpbiB5b3VyIElDVS4gSXQgd2lsbCBiZSBzZW50IG9uIHRoZSBmaXJzdCBvZiB0aGUgbW9udGggZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgQ09WSUQtMTkgb3V0YnJlYWsuICAK4oCiCUEgcmVwb3J0IHN1bW1hcml6aW5nIHRoZSByZXN1bHRzIGFmdGVyIGVhY2ggbW9udGhseSBzdXJ2ZXkgIAoKKipFdGhpY3MgYW5kIHByaXZhY3k6KiogVGhpcyBzdHVkeSBoYXMgYmVlbiByZXZpZXdlZCBieSB0aGUgSGFtaWx0b24gSW50ZWdyYXRlZCBSZXNlYXJjaCBFdGhpY3MgQm9hcmQuIFBhcnRpY2lwYXRpb24gaXMgb2YgY291cnNlIHZvbHVudGFyeSBhbmQgc3VibWl0dGluZyBkYXRhIGltcGxpZXMgeW91ciBjb25zZW50IHRvIHBhcnRpY2lwYXRlIC4gWW91IGNhbiBzdG9wIHBhcnRpY2lwYXRpbmcgYXQgYW55IHRpbWUgYW5kIHByaW9yIHRvIGFuYWx5c2lzIHlvdSBjYW4gd2l0aGRyYXcgYW55IGRhdGEgZnJvbSB5b3VyIGNlbnRyZS4gV2Ugd2lsbCBub3QgcHVibGlzaCBhbnkgc2l0ZSBvciBwZXJzb25hbCBpZGVudGlmeWluZyBpbmZvcm1hdGlvbiB3aXRob3V0IHlvdXIgZXhwcmVzcyBjb25zZW50LiAgCiAgClRoYW5rIHlvdSwgYW5kIHdlIHdlbGNvbWUgYW55IHN1Z2dlc3Rpb25zIGZvciBhZGFwdGluZyBhbmQgdXBkYXRpbmcgdGhpcyBzdXJ2ZXkgYXMgZXZlbnRzIGluIHRoaXMgcGFuZGVtaWMgdW5mb2xkLiAgCiAKKipNYXJrIER1ZmZldHQqKiwgUlBoIFBoRCAgCkRlcGFydG1lbnRzIG9mIFBlZGlhdHJpY3MgYW5kIEhlYWx0aCBSZXNlYXJjaCBNZXRob2RzLCBFdmlkZW5jZSwgYW5kIEltcGFjdCwgTWNNYXN0ZXIgVW5pdmVyc2l0eSwgSGFtaWx0b24sIENhbmFkYS4gZHVmZmV0bWNAbWNtYXN0ZXIuY2EsIEBbTV9EdWZmZXR0XShodHRwOi8vdHdpdHRlci5jb20vTV9EdWZmZXR0KSAgCiAKKipNaWNoZWxsZSBLaG8qKiwgUFQgUGhEICAKU2Nob29sIG9mIFJlaGFiaWxpdGF0aW9uIFNjaWVuY2UsIE1jTWFzdGVyIFVuaXZlcnNpdHksIEhhbWlsdG9uLCBDYW5hZGEuIGtob21lQG1jbWFzdGVyLmNhLCBAW2tob21lXShodHRwOi8vdHdpdHRlci5jb20va2hvbWUpICAKCiAKCg==